{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['/mnt/tess/astronet/checkpoints/fa1t_38_run_1/1/AstroCNNModel_final_alpha_1_tuned_20220519_153609',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/2/AstroCNNModel_final_alpha_1_tuned_20220519_161708',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/3/AstroCNNModel_final_alpha_1_tuned_20220519_165750',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/4/AstroCNNModel_final_alpha_1_tuned_20220519_173827',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/5/AstroCNNModel_final_alpha_1_tuned_20220519_181858',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/6/AstroCNNModel_final_alpha_1_tuned_20220519_185933',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/7/AstroCNNModel_final_alpha_1_tuned_20220519_194021',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/8/AstroCNNModel_final_alpha_1_tuned_20220519_202120',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/9/AstroCNNModel_final_alpha_1_tuned_20220519_210211',\n",
       " '/mnt/tess/astronet/checkpoints/fa1t_38_run_1/10/AstroCNNModel_final_alpha_1_tuned_20220519_214256']"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "chkpt_root = '/mnt/tess/astronet/checkpoints/fa1t_38_run_1'\n",
    "data_files = '/mnt/tess/astronet/tfrecords-38-test/*'\n",
    "tces_file = '/mnt/tess/astronet/tces-v14-test.csv'\n",
    "\n",
    "nruns = 10\n",
    "\n",
    "def load_ensemble(chkpt_root, nruns):\n",
    "    checkpts = []\n",
    "    for i in range(nruns):\n",
    "        parent = os.path.join(chkpt_root, str(i + 1))\n",
    "        if not os.path.exists(parent):\n",
    "            break\n",
    "        all_dirs = os.listdir(parent)\n",
    "        if not all_dirs:\n",
    "            break\n",
    "        d, = all_dirs\n",
    "        checkpts.append(os.path.join(parent, d))\n",
    "    return checkpts\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running model 1\n",
      "2516 records\n",
      "Running model 2\n",
      "2516 records\n",
      "Running model 3\n",
      "2516 records\n",
      "Running model 4\n",
      "2516 records\n",
      "Running model 5\n",
      "2516 records\n",
      "Running model 6\n",
      "2516 records\n",
      "Running model 7\n",
      "2516 records\n",
      "Running model 8\n",
      "2516 records\n",
      "Running model 9\n",
      "2516 records\n",
      "Running model 10\n",
      "2516 records\n"
     ]
    }
   ],
   "source": [
    "import getpass\n",
    "import os\n",
    "from astronet import predict\n",
    "import tensorflow as tf\n",
    "\n",
    "\n",
    "def run_predictions(path):\n",
    "    predict.FLAGS = predict.parser.parse_args([\n",
    "      '--model_dir', path,\n",
    "      '--data_files', data_files,\n",
    "      '--output_file', '',\n",
    "    ])\n",
    "\n",
    "    return predict.predict()\n",
    "\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "ensemble_preds = []\n",
    "config = None\n",
    "for i, path in enumerate(paths):\n",
    "    print(f'Running model {i + 1}')\n",
    "    preds, config = run_predictions(path)\n",
    "    ensemble_preds.append(preds.set_index('astro_id'))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "labels = ['disp_e', 'disp_n', 'disp_j', 'disp_s', 'disp_b']\n",
    "\n",
    "col_e = labels.index('disp_e')\n",
    "thresh = 0.215"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "agg_preds = {}\n",
    "\n",
    "for preds in ensemble_preds:\n",
    "    for ex_id in preds.index:\n",
    "        if ex_id not in agg_preds:\n",
    "            agg_preds[ex_id] = []\n",
    "\n",
    "        row = preds[preds.index == ex_id]\n",
    "        pred_v = row.values[0]\n",
    "        if len(row.values) > 1:\n",
    "            print(f'Warning: duplicate predictions for {ex_id}')\n",
    "        if pred_v[col_e] >= thresh:\n",
    "            agg_preds[ex_id].append('disp_e')\n",
    "        else:\n",
    "            masked_v = [v if i != col_e else 0 for i, v in enumerate(pred_v)]\n",
    "            agg_preds[ex_id].append(preds.columns[np.argmax(masked_v)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "final_preds = []\n",
    "for ex_id in list(agg_preds.keys()):\n",
    "    counts = {l: 0 for l in labels}\n",
    "    for e in agg_preds[ex_id]:\n",
    "        counts[e] += 1\n",
    "    maxcount = max(counts.values())\n",
    "    counts.update({\n",
    "        'astro_id': ex_id,\n",
    "        'maxcount': maxcount,\n",
    "    })\n",
    "    final_preds.append(counts)\n",
    "    \n",
    "final_preds = pd.DataFrame(final_preds).set_index('astro_id')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "tce_table = pd.read_csv(tces_file, header=0, low_memory=False)\n",
    "tce_table['astro_id'] = tce_table['Astro ID']\n",
    "tce_table = tce_table.set_index('astro_id')\n",
    "for l in labels:\n",
    "    tce_table[l] = tce_table[l[:-1] + l[-1].upper()]\n",
    "tce_labels = tce_table[labels + ['TIC ID']]\n",
    "\n",
    "pl = final_preds.join(tce_labels, on='astro_id', how='left', lsuffix='_p')\n",
    "\n",
    "pl.head()\n",
    "pd.set_option('display.max_columns', None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall: 0.972\n",
      "Precision: 0.7570093457943925\n"
     ]
    }
   ],
   "source": [
    "ppos = (pl['disp_e_p'] > 0)\n",
    "pos = (pl['disp_e'] > 0)\n",
    "\n",
    "pneg = (pl['disp_e_p'] == 0)\n",
    "neg = (pl['disp_e'] == 0)\n",
    "\n",
    "print('Recall:', len(pl[ppos & pos]) / len(pl[pos]))\n",
    "print('Precision:', len(pl[ppos & pos]) / len(pl[ppos]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "116252237\n",
      "117789567\n",
      "129012152\n",
      "105020452\n",
      "31265416\n",
      "384074629\n",
      "69549569\n"
     ]
    }
   ],
   "source": [
    "for i in pl[pos & pneg]['TIC ID']:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "198883710\n",
      "267346717\n",
      "91329106\n",
      "354129146\n",
      "14739172\n",
      "431991565\n",
      "372711165\n",
      "317347811\n",
      "136756300\n",
      "142746471\n",
      "316627165\n",
      "41680093\n",
      "445605526\n",
      "459221499\n",
      "27843322\n",
      "50354055\n",
      "408093233\n",
      "64905065\n",
      "123982605\n",
      "129115637\n",
      "17059855\n",
      "277535606\n",
      "369643357\n",
      "38586438\n",
      "40457215\n",
      "418013928\n",
      "256003229\n",
      "468716176\n",
      "240403806\n",
      "395084760\n",
      "164410859\n",
      "29171191\n",
      "192875463\n",
      "28177695\n",
      "136466789\n",
      "404850274\n",
      "456564311\n",
      "466657734\n",
      "21683845\n",
      "277108565\n",
      "112988537\n",
      "404933760\n",
      "365608020\n",
      "340206201\n",
      "466227976\n",
      "294923253\n",
      "278415116\n",
      "337350767\n",
      "31694643\n",
      "269857938\n",
      "29984231\n",
      "419736622\n",
      "426032062\n",
      "387067244\n",
      "86259225\n",
      "318608749\n",
      "382254048\n",
      "404559668\n",
      "355363175\n",
      "310420324\n",
      "373779556\n",
      "290304391\n",
      "380394964\n",
      "350146296\n",
      "280868770\n",
      "404006437\n",
      "295372879\n",
      "409747080\n",
      "231744905\n",
      "183306212\n",
      "229810745\n",
      "372203477\n",
      "279161482\n",
      "129333155\n",
      "28168394\n",
      "403625251\n",
      "116575240\n",
      "374615768\n"
     ]
    }
   ],
   "source": [
    "for i in pl[neg & ppos]['TIC ID']:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def compare(ensemble_preds, filter):\n",
    "    result = ensemble_preds[0][filter]\n",
    "    for preds in ensemble_preds[1:]:\n",
    "        result = result.append(preds[filter])\n",
    "    return result\n",
    "\n",
    "# compare(ensemble_preds, preds.index == pl[pl['TIC ID'] == 28484801].index.values[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "# pl[pl.index == pl[pl['TIC ID'] == 1254504863].index.values[0]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PR curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "ids = set(ensemble_preds[0].index.values)\n",
    "\n",
    "index = {v: i for i, v in enumerate(ids)}\n",
    "\n",
    "pred_es = np.zeros([len(ensemble_preds), len(index)])\n",
    "for i, preds in enumerate(ensemble_preds):\n",
    "    for row in preds.iterrows():\n",
    "        ex_id, pred_e = row[0], row[1][col_e]\n",
    "        pred_es[i][index[ex_id]] = pred_e\n",
    "\n",
    "lbl_es = np.zeros([len(index)], dtype=np.bool)\n",
    "for row in tce_labels.iterrows():\n",
    "    ex_id, lbl_e = row[0], row[1]['disp_e']\n",
    "    lbl_es[index[ex_id]] = (lbl_e > 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_cond_pos = int(np.sum(lbl_es))\n",
    "\n",
    "def pr_at_th(th):\n",
    "    pred_pos = np.any(pred_es >= th, axis=0)\n",
    "    true_pos = pred_pos & lbl_es\n",
    "    num_pred_pos = int(np.sum(pred_pos))\n",
    "    num_true_pos = int(np.sum(true_pos))\n",
    "    if num_pred_pos == 0:\n",
    "        return 1.0, 0.0\n",
    "    return float(num_true_pos) / float(num_pred_pos), float(num_true_pos) / float(num_cond_pos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC: 0.9647226636251953, max R: 1.0, max P: 1.0\n",
      "100% recall at: 15%, threshold: 0.0004930858612606256\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1200x740 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "ps, rs, ths = ([], [], [])\n",
    "th = np.max(pred_es)\n",
    "while th >= 0.0:\n",
    "    p, r = pr_at_th(th)\n",
    "    ps.append(p)\n",
    "    rs.append(r)\n",
    "    ths.append(th)\n",
    "    th -= 0.0005\n",
    "    \n",
    "from sklearn import metrics\n",
    "\n",
    "print(f'AUC: {metrics.auc(rs, ps)}, max R: {max(rs)}, max P: {max(ps)}')\n",
    "    \n",
    "i = len(rs) - 1\n",
    "while rs[i] == 1.0:\n",
    "    i -= 1\n",
    "i += 1\n",
    "print(f'100% recall at: {int(ps[i] * 100)}%, threshold: {ths[i]}')\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(6, 3.7), dpi=200)\n",
    "\n",
    "ax.spines['top'].set_color('#808080')\n",
    "ax.spines['right'].set_color('#808080')\n",
    "ax.spines['left'].set_color('#808080')\n",
    "ax.spines['bottom'].set_color('#808080')\n",
    "ax.tick_params(direction='in', color='#808080')\n",
    "\n",
    "plt.grid(color='#c0c0c0', linestyle='--', linewidth=0.5)\n",
    "\n",
    "plt.ylabel('Precision', fontweight='bold')\n",
    "plt.xlabel('Recall', fontweight='bold')\n",
    "\n",
    "plt.xlim((0.0, 1.0))\n",
    "plt.ylim((0.0, 1.0))\n",
    "\n",
    "_ = plt.plot(rs, ps)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
